# -*- coding: utf-8 -*-
from db_conn import *
import io
import time
from datetime import datetime, timedelta
import traceback
import re
from anatel_utils import *
from warnings import filterwarnings

filterwarnings('error', category=MySQLdb.Warning)

def realImportDb(query):    
    cursor,conn = db_connect()
    
    try:
        page_offset = 10000
        cursor.execute('SELECT count(1) FROM `laguardia`.`anatel_import`;')
        total_items = cursor.fetchall()[0][0]
        print "total_items: %s" % (total_items)
        total_pages = (total_items/page_offset)
        total_pages+=1
        print "total_pages: %s" % (total_pages)
        
        field_names = ['id_antena',
                       'TransmissaoInicial',
                         'UnidadeFrequenciaTX',
                         'RecepcaoInicial',
                         'UnidadeFrequenciaRX',
                         'Situacao',
                         'CaraterSecundario',
                         'IndConfidencial',
                         'TipoClasseEstacao',
                         'Horarios',
                         'DesignacaoEmissao',
                         'PotenciaOperacao',
                         'UnidadePotencia',
                         'Equipamento',
                         'TipoAntena',
                         'EquipamentoAntena',
                         'Ganho',
                         'FrenteCosta',
                         'AnguloMeiaPotencia',
                         'AnguloElevacao',
                         'Azimute',
                         'VariacaoAzimutal',
                         'TipoPolarizacao',
                         'Altura',
                         'Raio',
                         'Latitude',
                         'Longitude',
                         'Altitude',
                         'Estacao',
                         'Servico',
                         'Indicativo',
                         'MedPotenciaMaxima_TR',
                         'MedLarguraBanda',
                         'DiametroSGCH',
                         'Diagrama',
                         'SiglaEstacao_TRS',
                         'LongitudeOrbitalSubida',
                         'NomeFeixeSubida',
                         'SiglaEstacaoDescida',
                         'LongitudeOrbitalDescida',
                         'NomeFeixeDescida',
                         'TipoEstacao',
                         'NomeEntidade',
                         'NumEntidade',
                         'NomeMunicipio',
                         'CodMunicipio',
                         'Endereco',
                         'UF',
                         'TipoClasseCorrespondencia',
                         'Rede',
                         'Distancia',]
        dict_fields={}        
        for f in range(len(field_names)):
            dict_fields[field_names[f]]=f            
        #aux_page_step = 0
        for aux_page_step in range(total_pages):
            print "aux_page_step: %s" % (aux_page_step)
            str_limit = "LIMIT %s,%s" % (page_offset*aux_page_step,page_offset)
            cursor.execute(query+str_limit)
            resp = cursor.fetchall()
            for row in resp:
                insert_query = "INSERT into anatel_real VALUES(" 
                #insert_query += str(row[0]) + ",'" + str("','".join(map(MySQLdb.escape_string, map(str, row[1:]))))
                
                insert_query += str(row[0])
                for r in row[1:]:
                    if not r == None:
                        insert_query += ",'%s'" % (MySQLdb.escape_string(str(r)))
                    else:
                        insert_query += ',NULL'
                        
                    #if not r == row[-1]:
                    #    insert_query += ''

                insert_query += ",NULL,NULL);"
                #print insert_query
                try:
                    cursor.execute(insert_query)
                except MySQLdb.Warning, e:
                    # handle warnings, if the cursor you're using raises them
                    print str(e)
                    arr_campo = re.findall("'([^']*)'", str(e));
                    print arr_campo[-1]
                    #print insert_anatel
                    #print col[field_names[arr_campo[0].replace("'","")]]
                    print arr_campo[-1] + '"' + str(row[int(dict_fields[arr_campo[-1]])]) + '"'    
                    continue                      
                except:
                    print "Erro ao atualizar o banco: %s" % (insert_query)
                    exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()
                    traceback.print_exception(exceptionType, exceptionValue, exceptionTraceback,
                                  limit=2, file=sys.stdout)        
    except:
        print "Erro ao atualizar o banco: %s" % (insert_query)
        exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()
        traceback.print_exception(exceptionType, exceptionValue, exceptionTraceback,
                          limit=2, file=sys.stdout)
    finally:
        
        db_disconnect(cursor,conn)
        

def realImportUpdatesDb(query):    
    cursor,conn = db_connect()
    
    try:
        cursor.execute(query)
        resp = cursor.fetchall()
        for row in resp:
            #verifica a tabela de atualizacoes pra definir o que foi alterado
            select_atualizacoes = """
            SELECT  `id_atualizacao`,  `id_antena`,  `id_tipoAtualizacao`,  `nome_campo`,  `valor_antigo`,  `valor_novo`,  `Atualizacao` 
            FROM `laguardia`.`anatel_atualizacoes` 
            WHERE `id_antena` = %s 
            AND Atualizacao >= '%s'
            """ % (row[0],row[-1])            
            
            ############updates from anatel_import########################
            #define se foi atualizado manualmente em anatel_real
            cursor.execute(select_atualizacoes+" AND `id_tipoAtualizacao` = 2;")
            resp_real = cursor.fetchall()
            for row_atualizacoes in resp_real:
                #verifica se já houve alguma atualizacao manual (anatel_real) pra esse campo
                select_atualizacoes_passadas = """
                    SELECT  `id_atualizacao`,  `id_antena`,  `id_tipoAtualizacao`,  `nome_campo`,  `valor_antigo`,  `valor_novo`,  `Atualizacao` FROM `laguardia`.`anatel_atualizacoes` 
                    WHERE `id_antena` = %s 
                    AND `id_tipoAtualizacao` = 5 
                    AND `nome_campo` = '%s'
                    """ % (row[0],row_atualizacoes[3])
                cursor.execute(select_atualizacoes_passadas)
                resp_past_updates = cursor.fetchall()
                if not (len(resp_past_updates)>0):
                    #nao há atualizacoes passadas, pode atualizar.
                    update_anatel_real = "update `laguardia`.`anatel_real` set %s = '%s' where id_antena = %s" % (row_atualizacoes[3],row_atualizacoes[5],row[0])
                    cursor.execute(update_anatel_real)
                    updateTable(row[0],9,row_atualizacoes[3],row_atualizacoes[4],row_atualizacoes[5])
                else:
                    updateTable(row[0],7,row_atualizacoes[3],row_atualizacoes[4],row_atualizacoes[5])
                    print "Nao pode atualizar campo '%s', id_antena '%s' pois jah houve uma atualizacao manual desse campo" % (row_atualizacoes[3],row[0])
                
            ############insert anatel_real from anatel_import########################
            cursor.execute(select_atualizacoes+" AND `id_tipoAtualizacao` = 1;")
            resp_real = cursor.fetchall()
            #via de regra esse for deve ter exclusivamente 1 unico loop.
            for row_atualizacoes in resp_real:                              
                #insert_query = "INSERT into `laguardia`.`anatel_real` VALUES(" 
                #insert_query += str(row[0]) + ",'" + str("','".join(map(MySQLdb.escape_string, map(str, row[1:-1]))))
                #insert_query += "',NULL,NULL);"
                
                insert_query = "INSERT into anatel_import VALUES("
                insert_query += str(row[0]) + ",'"
                for r in row[1:-1]:
                    if len(str(r))>0:
                        insert_query += ",'%s'" % (str(MySQLdb.escape_string(r)))
                    else:
                        insert_query += ',NULL'
                insert_query += ",NULL,NULL);"
                #print insert_query
                cursor.execute(insert_query)
                updateTable(row[0],8)
            
            ############delete anatel_real from anatel_import########################  
            cursor.execute(select_atualizacoes+" AND `id_tipoAtualizacao` = 3;")
            resp_real = cursor.fetchall()
            #via de regra esse for deve ter exclusivamente 1 unico loop.
            for row_atualizacoes in resp_real:   
                delete_anatel_real = "DELETE FROM `laguardia`.`anatel_real` "   
                delete_anatel_real = "WHERE id_anatena = %s" % (row[0])
                #print delete_anatel_real
                cursor.execute(delete_anatel_real)
                updateTable(row[0],10)
                                    
    except:
        print "Erro ao atualizar o banco"
        exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()
        traceback.print_exception(exceptionType, exceptionValue, exceptionTraceback,
                          limit=2, file=sys.stdout)
    finally:
        
        db_disconnect(cursor,conn)


def execServerLit(command):
    import os
    #print command
    execute_command = os.popen(command,"r")
    return execute_command.read()

    
def getLineByNumber(line_nbr,file_name):
    linesByNbr=execServerLit("sed -n '%sp' %s" % (line_nbr,file_name))
    #print "linesByNbr: %s" % linesByNbr
    return linesByNbr


    
def getMatchedLine(s1,file_name):
    #print 'grep -n -F "%s" %s' % (s1,file_name)
    resposta=execServerLit('grep -n -F "%s" %s' % (s1,file_name)) 
    #print "resposta: %s" % (resposta)
    try:
        return str(resposta).split(":")[0]
    except:
        return 0    
    
if __name__ == '__main__':
    
    #Global initial variables
    full_reload=0
    
    if not len(sys.argv) < 2:
        
        for v in sys.argv:
            if len(v.split("="))>1:
                param = v.split("=")[0].strip()
                valor = v.split("=")[1].strip()
                try:
                    if param.lower().strip().find("full_reload")>-1:
                        full_reload = valor
                        print "full_reload: %s" % (full_reload)                                                                
                    else:
                        eval('%s=%s' % (param,valor))   
                    #print "Param: %s" % (param)
                    #print "Valor: %s" % (valor)
                except:
                    exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()
                    traceback.print_exception(exceptionType, exceptionValue, exceptionTraceback,
                                      limit=2, file=sys.stdout)      
    start_total = time.time()
    
    if full_reload:
        select_export_id = """
        SELECT `id_antena`, 
        `TransmissaoInicial`,
         `UnidadeFrequenciaTX`,
         `RecepcaoInicial`,
         `UnidadeFrequenciaRX`,
         `Situacao`,
         `CaraterSecundario`,
         `IndConfidencial`,
         `TipoClasseEstacao`,
         `Horarios`,
         `DesignacaoEmissao`,
         `PotenciaOperacao`,
         `UnidadePotencia`,
         `Equipamento`,
         `TipoAntena`,
         `EquipamentoAntena`,
         `Ganho`,
         `FrenteCosta`,
         `AnguloMeiaPotencia`,
         `AnguloElevacao`,
         `Azimute`,
         `VariacaoAzimutal`,
         `TipoPolarizacao`,
         `Altura`,
         `Raio`,
         `Latitude`,
         `Longitude`,
         `Altitude`,
         `Estacao`,
         `Servico`,
         `Indicativo`,
         `MedPotenciaMaxima_TR`,
         `MedLarguraBanda`,
         `DiametroSGCH`,
         `Diagrama`,
         `SiglaEstacao_TRS`,
         `LongitudeOrbitalSubida`,
         `NomeFeixeSubida`,
         `SiglaEstacaoDescida`,
         `LongitudeOrbitalDescida`,
         `NomeFeixeDescida`,
         `TipoEstacao`,
         `NomeEntidade`,
         `NumEntidade`,
         `NomeMunicipio`,
         `CodMunicipio`,
         `Endereco`,
         `UF`,
         `TipoClasseCorrespondencia`,
         `Rede`,
         `Distancia`
         FROM `laguardia`.`anatel_import` 
        """        
        realImportDb(select_export_id)

    select_atualizacoes = """
    SELECT `id_antena`, 
    `TransmissaoInicial`,
     `UnidadeFrequenciaTX`,
     `RecepcaoInicial`,
     `UnidadeFrequenciaRX`,
     `Situacao`,
     `CaraterSecundario`,
     `IndConfidencial`,
     `TipoClasseEstacao`,
     `Horarios`,
     `DesignacaoEmissao`,
     `PotenciaOperacao`,
     `UnidadePotencia`,
     `Equipamento`,
     `TipoAntena`,
     `EquipamentoAntena`,
     `Ganho`,
     `FrenteCosta`,
     `AnguloMeiaPotencia`,
     `AnguloElevacao`,
     `Azimute`,
     `VariacaoAzimutal`,
     `TipoPolarizacao`,
     `Altura`,
     `Raio`,
     `Latitude`,
     `Longitude`,
     `Altitude`,
     `Estacao`,
     `Servico`,
     `Indicativo`,
     `MedPotenciaMaxima_TR`,
     `MedLarguraBanda`,
     `DiametroSGCH`,
     `Diagrama`,
     `SiglaEstacao_TRS`,
     `LongitudeOrbitalSubida`,
     `NomeFeixeSubida`,
     `SiglaEstacaoDescida`,
     `LongitudeOrbitalDescida`,
     `NomeFeixeDescida`,
     `TipoEstacao`,
     `NomeEntidade`,
     `NumEntidade`,
     `NomeMunicipio`,
     `CodMunicipio`,
     `Endereco`,
     `UF`,
     `TipoClasseCorrespondencia`,
     `Rede`,
     `Distancia`,
     `Atualizacao`
     FROM `laguardia`.`anatel_import`     
     where Atualizacao >= (select max(Atualizacao) from `laguardia`.`anatel_real`);
    """
    realImportUpdatesDb(select_atualizacoes)


    print "(Total Tempo Gasto: %s)" % ((time.time() - start_total))